﻿using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using StockholmsStad.Data.Interfaces;
using StockholmsStad.Runtime.Serialization.DataContract;
using StockholmsStad.Utilities;

namespace StockholmsStad.Data.Test
{
    /// <summary>
    /// Summary description for UnitTest1
    /// </summary>
    [TestClass]
    public class TestUnitMail : TestUnitBase
    {
        private const string APP_KEY = "RecipientAddress";
        private string recipient;

        // before running each test 
        [TestInitialize()]
        public void MyTestInitialize()
        {
            recipient = SettingsUtility.GetAppSetting(APP_KEY);
            BeginTransaction();
        }

        // after each test has run
        [TestCleanup()]
        public void MyTestCleanup()
        {
            // Use this if you want to test email
            const bool completeTransaction = true;
            EndTransaction(completeTransaction);

            //EndTransaction();
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        /// </summary>
        [TestMethod]
        public void SendConfirmedBookingMailTest()
        {
            IBookingAgent bookingAgent = AgentFactory.GetBookingAgent();
            bookingAgent.SendConfirmedBookingMail(context, recipient, DateTime.Now);
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        /// </summary>
        [TestMethod]
        public void SendIndividualBookingMailTest()
        {
            IBookingAgent bookingAgent = AgentFactory.GetBookingAgent();
            Booking testBooking = TestEntity.GetIndividualBooking();
            Ticket testTicket = TestEntity.GetNewIssue();
            bookingAgent.SendIndividualBookingMail(context, testTicket);
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        /// </summary>
        [TestMethod]
        public void SendIndividualBookingToMinisterMailTest()
        {
            IBookingAgent bookingAgent = AgentFactory.GetBookingAgent();
            Ticket testTicket = TestEntity.GetNewIssue();
            Booking testBooking = TestEntity.GetIndividualBooking();
            bookingAgent.SendIndividualBookingToMinisterMail(context, recipient, testTicket, testBooking);
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        /// </summary>
        [TestMethod]
        public void SendMinisterServiceReminderMailTest()
        {
            IMinisterAgent ministerAgent = AgentFactory.GetMinisterAgent();
            Ticket testTicket = TestEntity.GetNewIssue();
            ministerAgent.SendMinisterServiceReminderMail(context, recipient, testTicket, DateTime.Now);
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        /// </summary>
        [TestMethod]
        public void SendOrdinaryBookingMailTest()
        {
            IBookingAgent bookingAgent = AgentFactory.GetBookingAgent();
            Ticket testTicket = TestEntity.GetNewIssue();
            bookingAgent.SendOrdinaryBookingMail(context, null);
            bookingAgent.SendOrdinaryBookingMail(context, new Ticket());
            bookingAgent.SendOrdinaryBookingMail(context, testTicket);
            //                                     new Ticket() {  BookingId = , DateTime = new TimeBlock() { StartDateTime = DateTime.Now } });
            //bookingAgent.SendOrdinaryBookingMail(context, recipient,
            //                                     new Booking()
            //                                     {  
            //                                         PreferredDate1 = DateTime.Now,   
            //                                         PreferredDate2 = null,
            //                                     });
            //bookingAgent.SendOrdinaryBookingMail(context, recipient,
            //                                     new Booking()
            //                                     {
            //                                         DateTime = new TimeBlock() { StartDateTime = DateTime.Now },
            //                                         PreferredDate1 = DateTime.Now,
            //                                         PreferredDate2 = DateTime.Now,
            //                                     });
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        /// </summary>
        [TestMethod]
        public void SendOrdinaryBookingWithoutBookingMailTest()
        {
            IBookingAgent bookingAgent = AgentFactory.GetBookingAgent();    
            bookingAgent.SendPreferredOrdinaryBookingMail(context, recipient,
                                                                new Booking()
                                                                {
                                                                    PreferredDate1 = DateTime.Now,
                                                                    PreferredDate2 = DateTime.Now,
                                                                });
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        /// </summary>
        [TestMethod]
        public void SendOrdinaryBookingWithoutPreferredDateMailTest()
        {
            IBookingAgent bookingAgent = AgentFactory.GetBookingAgent();
            bookingAgent.SendOrdinaryBookingWithoutPreferredDateMail(context, recipient,
                                                                        new Booking()
                                                                        {
                                                                            DateTime = new TimeBlock() { StartDateTime = DateTime.Now }
                                                                        });
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        /// </summary>
        [TestMethod]
        public void SendPreferredDateNotificationMailTest()
        {
            IBookingAgent bookingAgent = AgentFactory.GetBookingAgent();
            bookingAgent.SendPreferredDateNotification(context, DateTime.Now);
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        /// </summary>
        [TestMethod()]
        public void SendRegistrationMailTest()
        {
            var ticketAgent = AgentFactory.GetTicketAgent();
            string email = recipient;
            PersonDetails person = new Person() { Email = email, FirstNames = "Svenne", LastName = "Snorslev" };
            string username = email;
            const string password = "pAsSwOrD";
            ticketAgent.SendRegistrationMail(context, person, username, password);
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        /// </summary>
        [TestMethod()]
        public void SendRegistrationInParvisMailTest()
        {
            var ticketAgent = AgentFactory.GetTicketAgent();
            var parvisUser = new ParvisUser(){
                                                Username = recipient,
                                                Password = "pazzwård"
                                            };
            ticketAgent.SendRegistrationInParvisMail(context, parvisUser);
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        /// </summary>
        [TestMethod()]
        public void SendRemindCoupleOfImpedimentDocMailTest()
        {
            ICoupleAgent coupleAgent = AgentFactory.GetCoupleAgent();
            Ticket testTicket = TestEntity.GetNewIssue();
            testTicket.Ceremony.ImpedimentDocLatestDate = new DateTime(2019, 01, 01, 14, 0, 0);
            coupleAgent.RemindCoupleOfImpedimentDocMail(context, recipient, testTicket);
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        /// </summary>
        [TestMethod()]
        public void SendRemoveBookingMailTest()
        {
            IBookingAgent bookingAgent = AgentFactory.GetBookingAgent();
            bookingAgent.SendRemoveBookingMail(context, recipient, new Booking());
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        /// </summary>
        [TestMethod()]
        public void SendRemoveBookingImpedimentDocMailTest()
        {
            IBookingAgent bookingAgent = AgentFactory.GetBookingAgent();
            bookingAgent.SendRemoveBookingImpedimentDocMail(context, recipient);
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        /// </summary>
        [TestMethod()]
        public void SendRemoveIndividualBookingToMinisterMailTest()
        {
            IBookingAgent bookingAgent = AgentFactory.GetBookingAgent();
            Ticket testTicket = TestEntity.GetNewIssue();
            Booking testBooking = TestEntity.GetIndividualBooking();
            bookingAgent.SendRemoveIndividualBookingToMinisterMail(context, recipient, testTicket, testBooking);
        }

        /// <summary>
        /// För att committa: se test initialize transaktion och testmail ska därför skickas ut...
        ///</summary>
        [TestMethod()]
        public void SendForgottenPasswordMailTest()
        {
            IUserAgent userAgent = AgentFactory.GetUserAgent();
            string email = recipient;
            PersonDetails person = new Person() { Email = email, FirstNames = "Svenne", LastName = "Snorslev" };
            User user = new User() { Username = recipient, Password = "pAsSwOrD" };
            userAgent.SendForgottenPasswordMail(context, person, user);
        }



    }
}